﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace MedicalAssistant.core
{
    [Serializable]
    public class Paciente
    {
        public enum Sexualidade
        {
            M,
            F
        } ;

        private string nome;
        private uint prontuario;
        private string telefone;
        private DateTime dataDeNascimento;
        private string responsavel;
        private Sexualidade sexo;
        private Endereco endereco;
        private List<Consulta> consultas;


        public Paciente()
        {
        }


        public Paciente(string nome, uint prontuario, string telefone, DateTime dataDeNascimento, string responsavel, Sexualidade sexo, Endereco endereco)
        {
            this.Nome = nome;
            this.prontuario = prontuario;
            this.Telefone = telefone;
            this.DataDeNascimento = dataDeNascimento;
            this.Responsavel = responsavel;
            this.sexo = sexo;
            this.Endereco = endereco;
            this.consultas = new List<Consulta>();
        }

        public Consulta GerarConsulta(double alturaEmCentimetros, double pesoEmQuilos, Consulta.TipoDeConsulta tipo)
        {
            Consulta consulta = new Consulta(alturaEmCentimetros, pesoEmQuilos, tipo);
            this.consultas.Add(consulta);
            return consulta;
        }

        public override bool Equals(System.Object obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            if (obj.GetType() != typeof (Paciente)) return false;
            return Equals((Paciente) obj);
        }


        public string Nome
        {
            get { return nome; }
            set
            {
                if (String.IsNullOrEmpty(value))
                {
                    throw new ExcecaoDoSistema("Nome obrigatório.");
                }
                nome = value.Trim();
            }
        }

        public uint Prontuario
        {
            get { return prontuario; }
            set { prontuario = value; }
        }

        public string Telefone
        {
            get { return telefone; }
            set
            {
                if (String.IsNullOrEmpty(value))
                {
                    throw new ExcecaoDoSistema("Telefone obrigatório.");
                }

                telefone = value.Trim();
            }
        }

        public DateTime DataDeNascimento
        {
            get { return dataDeNascimento; }
            set
            {
                DateTime valor = value;
                if (ReferenceEquals(null, valor))
                {
                    throw new ExcecaoDoSistema("Data de nascimento obrigatória.");
                }
                if (value.CompareTo(DateTime.Now) > 0)
                {
                    throw new ExcecaoDoSistema("Data de nascimento não pode ser maior que a data atual.");
                }

                dataDeNascimento = value;
            }
        }

        public string Responsavel
        {
            get { return responsavel; }
            set
            {
                if (String.IsNullOrEmpty(value))
                {
                    throw new ExcecaoDoSistema("Nome do responsável obrigatório.");
                }
                responsavel = value.Trim();
            }
        }

        public Sexualidade Sexo
        {
            get { return sexo; }
            set { sexo = value; }
        }

        public Endereco Endereco
        {
            get { return endereco; }
            set
            {
                if (value == null)
                {
                    throw new ExcecaoDoSistema("Endereço obrigatório.");
                }
                endereco = value;
            }
        }

        public List<Consulta> Consultas
        {
            get { return consultas; }
        }

        public bool Equals(Paciente obj)
        {
            if (ReferenceEquals(null, obj)) return false;
            if (ReferenceEquals(this, obj)) return true;
            return obj.prontuario == prontuario;
        }

        public override int GetHashCode()
        {
            return prontuario.GetHashCode();
        }
    }
}
